/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2009，所有权利保留。
 * 
 * 项目名：	rumba-widget2
 * 文件名：	RTipButton.java
 * 模块说明：	
 * 修改历史：
 * Jan 27, 2009 - lxm - 创建。
 */
package com.hd123.rumba.gwt.widget2.client.tip;

import java.util.ArrayList;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.SimplePanel;

/**
 * 
 * 提示控件。将显示一个提示图标，当光标移动到其上方的时候将显示出提示信息。
 * <p>
 * 
 * <b>CSS Style Rules</b>
 * <ol type=disc>
 * <li>.rb-TipButton { }</li>
 * <li>.rb-TipButton-error { 当错误状态时 }</li>
 * <li>.rb-TipButton-warning{ 当警告状态时 }</li>
 * <li>.rb-TipButton-info { 当信息状态时 }</li>
 * </ol>
 * 
 * @author lxm
 * 
 */
public class RTipButton extends SimplePanel {

  private static final String STYLENAME_DEFAULT = "rb-TipButton";

  /**
   * 创建对象实例。
   */
  public RTipButton() {
    super();
    DOM.setInnerText(getElement(), " ");
    setVisible(false);
    setStyleName(STYLENAME_DEFAULT);
  }

  /** List of RTip */
  private ArrayList tips = new ArrayList();
  private String currentStyleSuffix = RTipInfo.TipLevel.nothing.getName();

  /**
   * 绑定提示信息数据对象。
   * 
   * @param tip
   *            指定的提示信息数据对象。
   */
  public void bind(RTip tip) {
    if (tip == null)
      return;
    if (this == tip.getButton())
      return;
    if (tip.getButton() != null)
      tip.getButton().unbind(tip);
    tip.setButton(this);
    tips.add(tip);
    refresh();
  }

  /**
   * 取消对指定提示信息数据的绑定。
   * 
   * @param tip
   *            指定提示信息数据对象。
   */
  public void unbind(RTip tip) {
    if (tip == null)
      return;
    if (!tips.contains(tip))
      return;
    tip.setButton(null);
    tips.remove(tip);
    refresh();
  }

  /**
   * 刷新屏幕显示。
   */
  public void refresh() {
    RTipInfo tip = getDisplayed();
    
    // 刷新style
    String styleSuffix = RTipInfo.TipLevel.nothing.getName();
    if (tip != null) 
      styleSuffix = tip.getLevel().getName();
    if (!currentStyleSuffix.equals(styleSuffix)) {
      if (!RTipInfo.TipLevel.nothing.getName().equals(currentStyleSuffix)) {
        removeStyleDependentName(currentStyleSuffix);
        setVisible(false);
      }
      currentStyleSuffix = styleSuffix;
      if (!RTipInfo.TipLevel.nothing.getName().equals(currentStyleSuffix)) {
        addStyleDependentName(currentStyleSuffix);
        setVisible(true);
      }
    }
    
    // 刷新title
    if (tip == null)
      setTitle("");
    else
      setTitle(tip.getMessage());
  }

  /** 取得当前显示提示信息。 */
  private RTipInfo getDisplayed() {
    RTipInfo displayed = null;

    for (int i = 0, n = tips.size(); i < n; i++) {
      RTip tip = (RTip) tips.get(i);
      RTipInfo tipInfo = tip.getDisplayed();
      if (tipInfo == null)
        continue;
      if (displayed == null)
        displayed = tipInfo;
      else if (displayed.getLevel().compareTo(tipInfo.getLevel()) < 0)
        displayed = tipInfo;
    }

    return displayed;
  }

}
